package com.vim.common.utils;

import com.vim.modules.web.model.WeixinMenu;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WeixinTreeList {
    private List<WeixinMenu> resultNodes = new ArrayList<WeixinMenu>();//树形结构排序之后list内容
    private List<WeixinMenu> nodes; //传入list参数
    public WeixinTreeList(List<WeixinMenu> nodes) {//通过构造函数初始化
        this.nodes = nodes;
    }

    /**
     * 构建树形结构list
     * @return 返回树形结构List列表
     */
    public List<WeixinMenu> buildTree() {
        for (WeixinMenu node : nodes) {
            if (node.getMenuParentId().equals("0")) {//通过循环一级节点 就可以通过递归获取二级以下节点
                resultNodes.add(node);//添加一级节点
                build(node);//递归获取二级、三级、。。。节点
            }
        }
        return resultNodes;
    }
    /**
     * 递归循环子节点
     *
     * @param node 当前节点
     */
    private void build(WeixinMenu node) {
        List<WeixinMenu> children = getChildren(node);
        if (!children.isEmpty()) {//如果存在子节点
            for (WeixinMenu child : children) {//将子节点遍历加入返回值中
                resultNodes.add(child);
                build(child);
            }
        }
    }
    /**
     * @param node
     * @return 返回
     */
    private List<WeixinMenu> getChildren(WeixinMenu node) {
        List<WeixinMenu> children = new ArrayList<WeixinMenu>();
        String id = node.getMenuId();
        for (WeixinMenu child : nodes) {
            if (id.equals(child.getMenuParentId())) {//如果id等于父id
                children.add(child);//将该节点加入循环列表中
            }
        }
        return children;
    }

    //获取显示列表
    public List<WeixinMenu> buildShowTree() {
        Map<String, WeixinMenu> listMap = new HashMap<>();
        List<WeixinMenu> oneLevel = new ArrayList<>();
        for (WeixinMenu node : nodes) {
            if(node.getMenuParentId().equals("0")){
                List<WeixinMenu> menuList = new ArrayList<>();
                node.setMenuList(menuList);
                listMap.put(node.getMenuId(), node);
            }
        }

        for (WeixinMenu node : nodes) {
            if(!node.getMenuParentId().equals("0")){
                if(listMap.get(node.getMenuParentId()) != null){
                    List<WeixinMenu> menuList = listMap.get(node.getMenuParentId()).getMenuList();
                    menuList.add(node);
                }
            }
        }

        for(String str:listMap.keySet()){
            oneLevel.add(listMap.get(str));
        }

        return oneLevel;
    }
}
